今天要介紹的是常見的分類任務驗證指標,會以二元分類問題為例,因為多元分類也是用相同的指標,只是計算方式會有所不同而已,預計會用 2-3 天的篇幅介紹完,分類與迴歸任務的驗證指標;先給各位讀者一個正確的觀念,選指標時必須回到業務背景與資料特性,不要迷信某個數值越高越好,真正有價值的模型評估,是能在技術表現與業務需求之間找到平衡。
分類任務的所有核心指標,幾乎都來自 Confusion Matrix,它是用來統計分類模型在測試集上的結果,Confusion Matrix 在 Binary Classification 問題上,它是一個 2x2 表格:
True Condition - Positive | True Condition - Negative | |
---|---|---|
Predict Outcome - Positive | TP (True Positve) | FP (False Positve) (誤報) |
Predict Outcome - Negative | FN (False Negative) (漏報) | TN (True Negative) |
$$
Accuracy = \frac{TP + TN}{TP + TN + FP + FN}
$$
就是看所有預測中,有多少的比例是預測正確的
Precision 是防止誤報 (Type I error) 的指標,適合保守策略,但單獨用它評估模型非常危險,因為它忽略漏報 (Type II error) 問題
$$
Precision = \frac{TP}{TP + FP}
$$
優點:
缺點:
適用高誤報成本場景:
Recall 是防止漏報 (Type II error) 的指標,適合在漏報代價高的情境使用,但單看 Recall 容易造成誤報氾濫,因此常和 Precision 一起使用 (F1-score 或 Precision-Recall 曲線)
$$
Recall = \frac{TP}{TP + FN}
$$
優點:
缺點:
適用高漏報成本場景:
(在安全性應用中重要,寧可多報也不能漏報)
Precision 與 Recall 的調和平均 (harmonic mean),想同時兼顧 Precision (正例預測的正確性) 和 Recall (正例檢出的完整性) 時,用 F1-score 評估整體表現
$$
F1-score = 2 \times \frac{Precision \times Recall}{Precision + Recall}
$$
優點:
缺點:
典型使用場景:
ROC-AUC 是「排序能力」的評估指標,不是「預測正確率」,高 AUC 意味著模型傾向將正例分數排得比負例高,在類別極度不平衡的情況下,ROC-AUC 可能會給出過於樂觀的結果 (建議搭配 PR-AUC 與實際混淆矩陣分析)
優點:
缺點:
典型使用場景:
當你改變分類閾值 (threshold) 時,模型會有不同的 TPR 與 FPR 組合,連起來就形成 ROC 曲線
ROC 曲線下的面積,就是 AUC
數值範圍:
統計解讀:
PR-AUC 更貼近「找出稀有重要事件」的實務需求,在極度不平衡資料中,比 ROC-AUC 更真實,但它對正例比例非常敏感,因此跨資料集比較要小心
優點:
缺點:
典型使用場景:
當你改變分類閾值 (threshold) 時,模型會有不同的 TPR 與 FPR 組合,連起來就形成 ROC 曲線
PR 曲線下的面積
特性 | ROC-AUC | PR-AUC |
---|---|---|
橫軸 | FPR | Recall |
縱軸 | TPR | Precision |
適用場景 | 類別分布均衡或中等不平衡 | 極度類別不平衡 (正例極少) |
敏感度 | 對負例數量不太敏感 | 對正例數量敏感 (專注於正例表現) |
誤報反映 | 間接反映 (FPR) | 直接反映 (Precision) |
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.pipeline import Pipeline
from sklearn.metrics import (
confusion_matrix, ConfusionMatrixDisplay,
accuracy_score, precision_score, recall_score, f1_score,
roc_auc_score, average_precision_score
)
import matplotlib.pyplot as plt
# 資料
X, y = load_digits(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
# 模型
clf = Pipeline([
("scaler", StandardScaler()),
("svc", SVC(kernel="rbf", probability=True, random_state=42))
])
clf.fit(X_train, y_train)
# 預測
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)
# 混淆矩陣
cm = confusion_matrix(y_test, y_pred)
disp = ConfusionMatrixDisplay(confusion_matrix=cm)
disp.plot(cmap=plt.cm.Blues)
plt.show()
# 評估
print("Accuracy:", accuracy_score(y_test, y_pred))
print("Macro Precision:", precision_score(y_test, y_pred, average="macro"))
print("Macro Recall:", recall_score(y_test, y_pred, average="macro"))
print("Macro F1:", f1_score(y_test, y_pred, average="macro"))
print("Weighted F1:", f1_score(y_test, y_pred, average="weighted"))
# 多分類 ROC-AUC
roc_auc = roc_auc_score(y_test, y_proba, multi_class="ovr", average="macro")
print("Macro ROC-AUC:", roc_auc)
# 多分類 PR-AUC
pr_auc = average_precision_score(y_test, y_proba, average="macro")
print("Macro PR-AUC:", pr_auc)
混淆矩陣是分類評估的根基,所有指標都只是對它不同切面的計算與加權,再次提醒,選指標時必須回到業務背景與資料特性,不要迷信某個數值越高越好,真正有價值的模型評估,是能在技術表現與業務需求之間找到平衡。